//package com.lvt.example.thinking.in.spring.questions.L23.transactional;
//
//import org.mybatis.spring.annotation.MapperScan;
//import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
//import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
//import org.springframework.context.ApplicationContext;
//import org.springframework.context.annotation.*;
////import org.springframework.transaction.annotation.EnableTransactionManagement;
//
///**
// * desc：class
// *
// * @author LT
// * @date 2022/10/25
// */
//
//@Configuration
//@ComponentScan
//@Import({JdbcConfig.class})
//@PropertySource("classpath:jdbc.properties")
//@MapperScan("ccom.lvt.example.thinking.in.spring.questions.L23.transactional")
////@EnableTransactionManagement
//@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
//@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
//public class AppConfig {
//
//    /**
//     * 从这个调用栈中我们看到了熟悉的 CglibAopProxy，另外事务本质上也是一种特殊的切面，
//     * 在创建的过程中，被 CglibAopProxy 代理。事务处理的拦截器是 TransactionInterceptor
//     *
//     * 首先，TransactionInterceptor 继承类 TransactionAspectSupport，实现了接口 MethodInterceptor。
//     * 当执行代理类的目标方法时，会触发 invoke()。由于我们的关注重点是在异常处理上，所以直奔主题，跳到异常处理相关的部分。
//     * 当它 catch 到异常时，会调用 completeTransactionAfterThrowing 方法做进一步处理。
//     *
//     * 如果没有在 @Transactional 中配置 rollback 属性，或是捕获到的异常和所配置异常的类型不一致，就会继续调用父类的 rollbackOn() 进行处理。
//     * 而在父类的 rollbackOn() 中，我们发现了一个重要的线索，只有在异常类型为 RuntimeException 或者 Error 的时候才会返回 true，
//     * 此时，会触发 completeTransactionAfterThrowing 方法中的 rollback 操作，事务被回滚。
//     * 案例抛出的异常是 Exception，又没有指定与之匹配的回滚规则，所以我们不能触发回滚。
//     */
//
//    public static void main(String[] args) throws Exception {
//        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
//        StudentService studentService = (StudentService) context.getBean("studentService");
//        studentService.saveStudent("小明");
//    }
//}